package com.galeno.redis;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import redis.clients.jedis.Jedis;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * @author galeno
 * @Title:
 * @Description:
 * @date 2021/9/1414:40
 */
public class RedisStringDemo {
    static Jedis jedis = new Jedis("galeno01", 6379);

    /**
     *
     * @param key
     * @param v
     * 两者都是保存一个值是value的数据key；
     * SETNX key value 只有在key不存在时候才保存数据，如果key存在，不做任何操作；
     * 而 SET key value 不管key是否存在，都会保存一个值是value的数据key。
     */
    public static void setStringData(String key,String v){
        jedis.set(key, v);
        // 如果key不存在才set，存在则不做
        jedis.setnx("name","lisi");

        // 插入一条string数据并设置存活时长（秒）
        jedis.setex(key,10L,v);

        // 插入一条string数据并设置存活时长（毫秒）
        jedis.psetex(key,10000,v);

        jedis.set(key.getBytes(),v.getBytes());



    }
    public static void getStringData(String key){
        String value = jedis.get(key);
        System.out.println(value);

        byte[] bytes = jedis.get(key.getBytes());
        String res = new String(bytes);

    }





    public static void main(String[] args) throws IOException, ClassNotFoundException {

        Person p = new Person("jimmy", 15, "male");
        setObj2StrStructure("a",p);
        Person newp = getObjFromStrStructure("a");
        System.out.println(p);


    }

    public static void setObj2StrStructure(String key, Person p) throws IOException {
        /**
         * 把一个person对象鵆到redis中 用string数据结构
         */
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(p);
        jedis.set(key.getBytes(StandardCharsets.UTF_8), baos.toByteArray());
    }

    public static Person getObjFromStrStructure(String key) throws IOException, ClassNotFoundException {
        byte[] bytes = jedis.get(key.getBytes(StandardCharsets.UTF_8));
        /**
         * 反序列化
         */
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));

        Person p = (Person) ois.readObject();

        return p;

    }


}


@Data
@NoArgsConstructor
@AllArgsConstructor
class Person implements Serializable {
    String name;
    Integer age;
    String gender;
}


